}
}
-static int mfn_in_hole(ulong mfn)
-{
- /* totally cheating */
- if (mfn >= (0xf0000000UL >> PAGE_SHIFT) &&
- mfn < (((1UL << 32) - 1) >> PAGE_SHIFT))
- return 1;
-
- return 0;
-}
-
static uint add_extent(struct domain *d, struct page_info *pg, uint order)
{
struct page_extents *pe;
return 0;
}
-ulong pfn2mfn(struct domain *d, long pfn, int *type)
+ulong pfn2mfn(struct domain *d, ulong pfn, int *type)
{
ulong rma_base_mfn = page_to_mfn(d->arch.rma_page);
ulong rma_size_mfn = 1UL << d->arch.rma_order;
}
if (test_bit(_DOMF_privileged, &d->domain_flags) &&
- mfn_in_hole(pfn)) {
+ cpu_io_mfn(pfn)) {
if (type)
*type = PFN_TYPE_IO;
return pfn;
/* This hack allows dom0 to map all memory, necessary to
* initialize domU state. */
- if (test_bit(_DOMF_privileged, &d->domain_flags)) {
+ if (test_bit(_DOMF_privileged, &d->domain_flags) &&
+ pfn < max_page) {
if (type)
*type = PFN_TYPE_REMOTE;
return pfn;
return log_large_page_sizes[0] - PAGE_SHIFT;
}
+
+/* This is more a platform thing than a CPU thing, but we only have
+ * one platform now */
+int cpu_io_mfn(ulong mfn)
+{
+ /* totally cheating */
+ if (mfn >= (2UL << (30 - PAGE_SHIFT)) && /* 2GiB */
+ mfn < (4UL << (30 - PAGE_SHIFT))) /* 4GiB */
+ return 1;
+
+ return 0;
+}
+
static u64 cpu0_hids[6];
static u64 cpu0_hior;
case PFN_TYPE_RMA:
case PFN_TYPE_LOGICAL:
break;
+
case PFN_TYPE_REMOTE:
+ /* I don't think this should ever happen, but I suppose it
+ * could be possible */
printk("%s: Dom:%d paddr: 0x%lx type: REMOTE\n",
__func__, d->domain_id, paddr);
WARN();
break;
+
+ case PFN_TYPE_IO:
default:
- panic("%s: Dom:%d paddr: 0x%lx bad type:0x%x\n",
+ printk("%s: Dom:%d paddr: 0x%lx bad type: 0x%x\n",
__func__, d->domain_id, paddr, mtype);
- break;
+ WARN();
+ return 0;
}
pa <<= PAGE_SHIFT;
pa |= offset;
#define PFN_TYPE_IO 3
#define PFN_TYPE_REMOTE 4
-extern ulong pfn2mfn(struct domain *d, long pfn, int *type);
+extern ulong pfn2mfn(struct domain *d, ulong pfn, int *type);
/* Arch-specific portion of memory_op hypercall. */
long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg);
extern uint cpu_large_page_orders(uint *sizes, uint max);
extern void cpu_initialize(int cpuid);
extern void cpu_init_vcpu(struct vcpu *);
+extern int cpu_io_mfn(ulong mfn);
extern void save_cpu_sprs(struct vcpu *);
extern void load_cpu_sprs(struct vcpu *);